require 'open-uri'

open("http://www.ruby-lang.org/en") do |f|
	f.each_line {|line| p line}
	puts f.base_uri   
	puts f.content_type
	puts f.charset
	puts f.content_encoding
	puts f.last_modified
end

#这一节是我觉得前面20节里面最让我模不着头脑的一节，它的作用是显示出该网站的开源码？中间的那个|f|又是什么用法？这一节说是讲的模组，但这一节里面的这些用法都不懂， f.each_line {|line| p line},这又是什么用法？
#open-uri应该就是一个module模组,前面require之后,你就可以使用这个module里的方法了,open就是其中一个
#你这在里其实是在调用open方法,给他传了两个参数?那个网址那个你当然知道了,另一个呢?另一个是do 到end那一个代码块,这也叫block,其实你也可以把do 到 end这一块看成一个方法, 事实上他就是一个方法, 这个方法接受一个参数, 这个方法体, 就是里面的f.each_line到后面puts那几行, 所以do 到end这一块跟这样的效果是一样的,
def some_method(f)
  f.each_line{|line| p line}
  puts f.base_uri
  puts f.content_type
  puts f.charset
  puts f.content_encoding
  puts f.last_modified
end

#只不过用do end定义的方法没有名字, 你可以叫它匿名方法吧, 有这个方法, 你其实也可以这样调用open
open("http://www.ruby-lang.org/en", &some_method)
#这样你可以勉强看得清楚点了吧? 也就是说除了字符串,数字, 这些值(value)可以作为参数, block代码块这种动作(action)也是可以作为参数的
#而这个代码块,怎么被用到呢?在open方法内部,就会使用到这个代码块了, 所以整个代码的意思是,open会把你给的这个网址打开(把内容下载下来),然后,调用这个代码块,把这个内容(就是一个网页了)作为参数传个这个代码块,然后就是执行这个代码块了,你注意到没有,在这个代码块内部,f.each_line{|line| p line}这也是传递了一个代码块,这个代码块就是大括号括起来的部分,而两个竖线之间和do后面那两个竖线是一样的意思,表示这个代码块需要一个参数, 后面的p line就是代码体, 所以这一句的意思就是, 对这个内容的每一行,去调用后面那个代码块,也就是打印这一行,最后就是把每一行都打印出来.明白了一点吗?
#我再换另一种方式给你解释一下, 好比你玩游戏, 你如果有一把刀, 那这可以看作一个简单的属性, 因为它就是一把刀, 如果你还有一项技能, 就是用刀杀人, 那这就可以看成一个动作, 虽然你还没有杀人, 但表示你可以施展这个技能, 杀一个人, 但这个技能的前提是你有一把刀, 如果你没有刀, 有这个技能也没用, 好, 现在我给你一张地图, 然后赋予你一项技能(拿刀杀人), 你先根据这张地图, 就拿到一把刀, 然后, 拿着这把刀施展这项技能, 杀一个人, OK, 结束了
#我给你地图和技能的时候, 就是在调用一个叫open的方法, 你在用这个地图找刀, 就是open方法内部在下载这个网页, 你拿着这把刀杀人的时候, 就是open方法内部在调用你传递进去的那个代码块(do end 定义的)
#f.each_line也是一样,这是一个方法,它只需要一个技能就可以了,这个技能就是给它什么, 它就打印什么, 然后each_line内部, 会把这个网页内容的每一行都拿出来(也就是会循环了), 然后调用这个技能, 打印每一行